/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.ipartek.formacion.gestformwww.controlador;

import com.ipartek.formacion.gestformwww.modelo.ModeloEntrega;
import com.ipartek.formacion.gestformwww.modelo.ModeloMaterial;
import com.ipartek.formacion.gestformwww.modelo.beans.Entrega;
import com.ipartek.formacion.gestformwww.modelo.beans.Material;
import com.ipartek.formacion.gestformwww.modelo.beans.excepciones.GestorFormacionExcepcion;
import java.util.ArrayList;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Clase que implementa accion, que se encarga de realizar las inserciones en las
 * tablas de entregas en base a la cantidad, y el stock de material.
 * viene de deatallesPdedido.jsp, y va a visualizacurso.jsp
 *
 * @author Santi, Fran
 */
public class RealizarPedidoAccion implements Accion {

    private static final String OBSERVACIONES_PEDIDO_NO_PEDIENTE = "Pedido Gestionado";
    private static final String OBSERVACIONES_PEDIDO_NO_GESTIONADO = "Pedido no Gestionado";
    private static final String OBSERVACIONES_PEDIDO_PENDIENTE = "Pedido Pendiente";
    private final String visualizarcursos = "visualizar-curso-accion";
    private ModeloMaterial modeloMaterial = null;
    private ModeloEntrega modeloEntrega = null;
    private int stockDisponible = 0;
    private int materialId = 0;
    private int cantidadPedir = 0;
    private int cantidadNecesaria = 0;
    private int idCurso = 0;
    ArrayList<String> mensajes = new ArrayList<String>();
    ArrayList<String> errores = new ArrayList<String>();
    int idPestana = 4;
    boolean correcto = false;
    boolean incorrecto = false;

    public AccionRouter ejecuta(HttpServlet servlet, HttpServletRequest request, HttpServletResponse response) {
        AccionRouter router = null;
        boolean gestionStock = true;

        Material material = null;
        Entrega entrega = null;
        AccionServlet as = (AccionServlet) servlet;
        if (request.getSession().getAttribute("usuario") != null && request.getMethod().equalsIgnoreCase("POST")) {

            if (request.getParameter("idCurso") != null) {
                idCurso = Integer.parseInt(request.getParameter("idCurso"));
            } else if (request.getAttribute("idCurso") != null) {
                idCurso = Integer.parseInt(request.getAttribute("idCurso").toString());
            }

            modeloMaterial = (ModeloMaterial) servlet.getServletContext().getAttribute("ModeloMaterial");
            modeloEntrega = (ModeloEntrega) servlet.getServletContext().getAttribute("ModeloEntrega");

            if (request.getParameter("materialId") != null) {
                materialId = Integer.parseInt(request.getParameter("materialId"));
            }

            if ((request.getParameter("cantPedir") != null) && (!request.getParameter("cantPedir").equals(""))) {
                cantidadPedir = Integer.parseInt(request.getParameter("cantPedir"));

            } else {
                incorrecto = true;
            }
            if ((request.getParameter("cantNecesaria") != null) && (!request.getParameter("cantNecesaria").equals(""))) {
                cantidadNecesaria = Integer.parseInt(request.getParameter("cantNecesaria"));
            } else {
                incorrecto = true;
            }
            if (request.getParameter("stockDisponible") != null) {
                stockDisponible = Integer.parseInt(request.getParameter("stockDisponible"));
            }
            if (request.getParameter("gestionStock") != null) {
                gestionStock = Boolean.parseBoolean(request.getParameter("gestionStock"));
            }
            try {

                material = modeloMaterial.getMaterial(materialId);
                entrega = new Entrega();
                entrega.setCurId(idCurso);
                entrega.setLibId(materialId);
                // Le ponemos el estadoPedido = 14 para que no casque en la insert
                entrega.setEstPedido(14);
                if (gestionStock) {
                    if (stockDisponible == 0) {
                        insertarLineaNoStock(material, entrega);
                    }
                    if ((stockDisponible > 0) && (cantidadPedir > 0)) {
                        insertarLineaStockInsuficiente(material, entrega);
                    }
                    if ((stockDisponible > 0) && (cantidadPedir == 0)) {
                        insertarLineaStockSuficiente(material, entrega);
                    }
                } else {
                    insertarLineaNoGestionPedido(material, entrega);
                }

                if (incorrecto) {
                    errores.add("error-creacion-entrega-imposible");
                    request.setAttribute("errores", errores);
                } else {
                    mensajes.add("mensaje-pedido-realizado");
                    request.getSession().setAttribute("mensajes", mensajes);
                }
                correcto = true;

            } catch (GestorFormacionExcepcion ex) {
                Logger.getLogger(RealizarPedidoAccion.class.getName()).log(Level.SEVERE, null, ex);
            }

            router = new AccionRouter("principal");
            request.setAttribute("idCurso", idCurso);
            request.setAttribute("idPestana", 4);
            request.setAttribute("contenido", "visualiza-curso");

            if (correcto) {

                try {
                    router = as.getFactory().getAction(as.getNombreClaseRecurso(visualizarcursos), servlet.getClass().getClassLoader()).ejecuta(servlet, request, response);
                } catch (ClassNotFoundException ex) {
                    Logger.getLogger(BorrarEntregaAccion.class.getName()).log(Level.SEVERE, null, ex);
                } catch (InstantiationException ex) {
                    Logger.getLogger(BorrarEntregaAccion.class.getName()).log(Level.SEVERE, null, ex);
                } catch (IllegalAccessException ex) {
                    Logger.getLogger(BorrarEntregaAccion.class.getName()).log(Level.SEVERE, null, ex);
                }

            } else {
                router = new AccionRouter("inicio");
            }


        } else {
            router = new AccionRouter("inicio");
        }
        return router;
    }

    public void insertarLineaNoStock(Material material, Entrega entrega) throws GestorFormacionExcepcion {
        Date fechaActual = new Date();
        entrega.setCantidad(cantidadPedir);
        entrega.setPedir(true);
        entrega.setEntFecha(fechaActual.toString());
        entrega.setObservaciones(OBSERVACIONES_PEDIDO_PENDIENTE);
        if (entrega.getCantidad() != 0) {
            modeloEntrega.insertarEntrega(entrega);
        }
        gestionStock();
    }

    public void insertarLineaStockSuficiente(Material material, Entrega entrega) throws GestorFormacionExcepcion {

        Date fechaActual = new Date();
        entrega.setCantidad(cantidadNecesaria);
        entrega.setPedir(false);
        entrega.setEntFecha(fechaActual.toString());
        entrega.setObservaciones(OBSERVACIONES_PEDIDO_NO_PEDIENTE);
        if (entrega.getCantidad() != 0) {
            modeloEntrega.insertarEntrega(entrega);
        }
        gestionStock();
    }

    public void insertarLineaStockInsuficiente(Material material, Entrega entrega) throws GestorFormacionExcepcion {

        Entrega entrega2 = entrega;
        Date fechaActual = new Date();

        entrega.setCantidad(cantidadPedir);
        entrega.setPedir(true);
        entrega.setEntFecha(fechaActual.toString());
        entrega.setObservaciones(OBSERVACIONES_PEDIDO_PENDIENTE);
        if (entrega.getCantidad() != 0) {
            modeloEntrega.insertarEntrega(entrega);
        }
        entrega2.setCantidad(stockDisponible);
        entrega2.setPedir(false);
        entrega2.setEntFecha(fechaActual.toString());
        entrega2.setObservaciones(OBSERVACIONES_PEDIDO_NO_PEDIENTE);
        if (entrega.getCantidad() != 0) {
            modeloEntrega.insertarEntrega(entrega2);
        }
        gestionStock();
    }

    public void insertarLineaNoGestionPedido(Material material, Entrega entrega) throws GestorFormacionExcepcion {

        Date fechaActual = new Date();
        entrega.setCantidad(cantidadNecesaria);
        entrega.setPedir(false);
        entrega.setEntFecha(fechaActual.toString());
        entrega.setObservaciones(OBSERVACIONES_PEDIDO_NO_GESTIONADO);
        if (entrega.getCantidad() != 0) {
            modeloEntrega.insertarEntrega(entrega);
        }
    }

    public void gestionStock() throws GestorFormacionExcepcion {
        Material material = modeloMaterial.getMaterial(materialId);
        int libCantidadAlu = material.getLibCantidadAlu();
        material.setLibCantidadAlu(libCantidadAlu - stockDisponible);
        modeloMaterial.modificarMaterial(material);
    }
}
